package nl.tudelft.bw4t.scenariogui.editor.gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelListener;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import nl.tudelft.bw4t.map.EntityType;
import nl.tudelft.bw4t.scenariogui.util.AbstractTableModel;
import nl.tudelft.bw4t.scenariogui.util.EntityJTable;
import nl.tudelft.bw4t.scenariogui.util.EntityTableModel;
import nl.tudelft.bw4t.scenariogui.util.RobotTableModel;
/**
* The EntityPanel class represents right pane of the MainPanel. It shows a list
* of bots and a list of e-partners and the actions that are possible to edit
* bots and e-partners.
*/
public class EntityPanel extends JPanel {
private static final long serialVersionUID = 6488182242349086899L;
public static final String AGENT_FILE = "Agent file";
public static final String NUMBER_BOTS_COLUMN = "Number of bots";
public static final String NUMBER_EPARTNERS_COLUMN = "Number of e-partners";
private static final int FONT_SIZE = 16;
private static final int BOT_OPTION_PANEL_GRID_ROWS_AMT = 15;
private static final int SCROLL_PANE_WIDTH = 500;
private static final int SCROLL_PANE_HEIGHT = 200;
private static final String ZERO = "0";
private JPanel botOptions = new JPanel();
private JPanel botToolbar = new JPanel();
private JPanel botMenu = new JPanel();
private JPanel botPane = new JPanel();
private JPanel botCounter = new JPanel();
private AbstractTableModel botList;
private EntityJTable botTable;
private static String botTableName;
private JScrollPane botScrollPane;
private JTextField botCountField = new JTextField();
private JButton newBot = new JButton("New Bot");
private JButton botDropDownButton = new BasicArrowButton(
SwingConstants.SOUTH);
private JPopupMenu botDropDownMenu = new JPopupMenu();
private JMenuItem standardBot = new JMenuItem("Standard Bot");
private JMenuItem standardBotBig = new JMenuItem("Big Standard Bot");
private JMenuItem standardBotGripper = new JMenuItem("Gripper Bot");
private JMenuItem standardBotBigGripper = new JMenuItem("Big Gripper Bot");
private JMenuItem standardBotSeeer = new JMenuItem("Seeer Bot");
private JMenuItem standardBotBigSeeer = new JMenuItem("Big Seeer Bot");
private JMenuItem standardBotCommunicator = new JMenuItem("Communicator Bot");
private JMenuItem standardBotBigCommunicator = new JMenuItem("Big Communicator Bot");
private JButton modifyBot = new JButton("Modify Bot");
private JButton deleteBot = new JButton("Delete Bot");
private JPanel epartnerToolbar = new JPanel();
private JPanel epartnerPane = new JPanel();
private JPanel epartnerCounter = new JPanel();
private DefaultTableModel epartnerList;
private EntityJTable ePartnerTable;
private static String ePartnerTableName;
private JScrollPane epartnerScrollPane;
private JTextField epartnerCountField = new JTextField();
private JButton newEpartner = new JButton("New E-partner");
private JButton modifyEpartner = new JButton("Modify E-partner");
private JButton deleteEpartner = new JButton("Delete E-partner");
private static final int BOT_OPTION_PANEL_MARGIN_WIDTH = 8;
//This is just for the modifyBot/modifyEpartner test,
//to see if the bot/epartner store actually opened
private boolean bs = false;
private boolean es = false;
/**
* Create an EntityPanel object.
*/
public EntityPanel() {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
Border loweredetched = BorderFactory
.createEtchedBorder(EtchedBorder.LOWERED);
TitledBorder title = BorderFactory.createTitledBorder(loweredetched,
"Entities");
title.setTitleJustification(TitledBorder.LEFT);
title.setTitleFont(new Font("Sans-Serif", Font.BOLD, FONT_SIZE));
setBorder(title);
createBotOptionPanel();
createBotPane();
createEpartnerPane();
add(botPane);
add(new JLabel(" "));
add(epartnerPane);
}
private void createBotOptionPanel() {
botOptions.setLayout(new GridLayout(BOT_OPTION_PANEL_GRID_ROWS_AMT, 2));
Border margin = BorderFactory.createEmptyBorder(
BOT_OPTION_PANEL_MARGIN_WIDTH, BOT_OPTION_PANEL_MARGIN_WIDTH,
BOT_OPTION_PANEL_MARGIN_WIDTH, BOT_OPTION_PANEL_MARGIN_WIDTH);
botOptions.setBorder(margin);
}
private void createBotPane() {
botPane.setLayout(new BorderLayout());
createBotToolbar();
createBotTable();
createBotCounter();
botPane.add(botToolbar, BorderLayout.NORTH);
botPane.add(botScrollPane, BorderLayout.CENTER);
botPane.add(botCounter, BorderLayout.SOUTH);
}
private void createBotToolbar() {
botToolbar.setLayout(new GridLayout(1, 0));
createDropDownMenuButtons();
botToolbar.add(botMenu);
botToolbar.add(new JLabel());
botToolbar.add(modifyBot);
botToolbar.add(new JLabel());
botToolbar.add(deleteBot);
}
private void createDropDownMenuButtons() {
botMenu.setLayout(new BorderLayout());
botDropDownMenu.add(standardBot);
botDropDownMenu.add(standardBotBig);
botDropDownMenu.add(standardBotGripper);
botDropDownMenu.add(standardBotBigGripper);
botDropDownMenu.add(standardBotSeeer);
botDropDownMenu.add(standardBotBigSeeer);
botDropDownMenu.add(standardBotCommunicator);
botDropDownMenu.add(standardBotBigCommunicator);
botDropDownButton.add(botDropDownMenu);
botMenu.add(botDropDownButton, BorderLayout.EAST);
botMenu.add(newBot, BorderLayout.CENTER);
}
/**
* Executes the action that needs to happen when the "arrow" button is
* pressed.
*/
public void showBotDropDown() {
botDropDownMenu.show(newBot, 0, botDropDownButton.getHeight());
}
private void createBotTable() {
botTable = new EntityJTable();
botTable.getTableHeader().setReorderingAllowed(false);
botTableName = "botTable";
botTable.setName(botTableName);
botList = new RobotTableModel();
botTable.setModel(botList);
botScrollPane = new JScrollPane(botTable);
botScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH,
SCROLL_PANE_HEIGHT));
setUpControllerColumn();
}
/**
* Create the dropdown lists in the controllers column.
*/
public void setUpControllerColumn() {
JComboBox<String> controllers = new JComboBox<String>();
controllers.addItem(EntityType.AGENT.toString());
controllers.addItem(EntityType.HUMAN.toString());
botTable.getColumnModel().getColumn(1)
.setCellEditor(new DefaultCellEditor(controllers));
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
botTable.getColumnModel().getColumn(1).setCellRenderer(renderer);
}
private void createBotCounter() {
botCounter.setLayout(new GridLayout(1, 0));
botCounter.add(new JLabel());
botCounter.add(new JLabel());
botCounter.add(new JLabel());
botCounter.add(new JLabel("Total number of bots:"));
botCountField.setText(ZERO);
botCountField.setEditable(false);
botCounter.add(botCountField);
}
private void createEpartnerPane() {
epartnerPane.setLayout(new BorderLayout());
createEpartnerToolbar();
createEpartnerTable();
createEpartnerCounter();
epartnerPane.add(epartnerToolbar, BorderLayout.NORTH);
epartnerPane.add(epartnerScrollPane, BorderLayout.CENTER);
epartnerPane.add(epartnerCounter, BorderLayout.SOUTH);
}
private void createEpartnerToolbar() {
epartnerToolbar.setLayout(new GridLayout(1, 0));
epartnerToolbar.add(newEpartner);
epartnerToolbar.add(new JLabel());
epartnerToolbar.add(modifyEpartner);
epartnerToolbar.add(new JLabel());
epartnerToolbar.add(deleteEpartner);
}
private void createEpartnerTable() {
ePartnerTable = new EntityJTable();
ePartnerTableName = "eparterTable";
ePartnerTable.setName(ePartnerTableName);
ePartnerTable.getTableHeader().setReorderingAllowed(false);
epartnerList = new EntityTableModel(EntityType.EPARTNER);
ePartnerTable.setModel(epartnerList);
epartnerList.addColumn("E-partner");
epartnerList.addColumn(AGENT_FILE);
epartnerList.addColumn(NUMBER_EPARTNERS_COLUMN);
epartnerScrollPane = new JScrollPane(ePartnerTable);
epartnerScrollPane.setPreferredSize(new Dimension(SCROLL_PANE_WIDTH,
SCROLL_PANE_HEIGHT));
}
private void createEpartnerCounter() {
epartnerCounter.setLayout(new GridLayout(1, 0));
epartnerCounter.add(new JLabel());
epartnerCounter.add(new JLabel());
epartnerCounter.add(new JLabel());
epartnerCounter.add(new JLabel("Total number of e-partners:"));
epartnerCountField.setText(ZERO);
epartnerCountField.setEditable(false);
epartnerCounter.add(epartnerCountField);
}
public final EntityJTable getBotTable() {
return botTable;
}
public void setBotTable(EntityJTable botTable) {
this.botTable = botTable;
}
public final AbstractTableModel getBotTableModel() {
return botList;
}
public final EntityJTable getEPartnerTable() {
return ePartnerTable;
}
public void setePartnerTable(EntityJTable ePartnerTable) {
this.ePartnerTable = ePartnerTable;
}
public final DefaultTableModel getEPartnerTableModel() {
return epartnerList;
}
public JButton getDropDownButton() {
return botDropDownButton;
}
public JMenuItem getAddNewStandardBotMenuItem() {
return standardBot;
}
public JMenuItem getAddNewStandardBotBigMenuItem() {
return standardBotBig;
}
public JMenuItem getAddNewStandardBotGripperMenuItem() {
return standardBotGripper;
}
public JMenuItem getAddNewStandardBotBigGripperMenuItem() {
return standardBotBigGripper;
}
public JMenuItem getAddNewStandardBotSeeerMenuItem() {
return standardBotSeeer;
}
public JMenuItem getAddNewStandardBotBigSeeerMenuItem() {
return standardBotBigSeeer;
}
public JMenuItem getAddNewStandardBotCommunicatorMenuItem() {
return standardBotCommunicator;
}
public JMenuItem getAddNewStandardBotBigCommunicatorMenuItem() {
return standardBotBigCommunicator;
}
/**
* Updates the bot count on the EntityPanel.
*
* @param count The total bot count.
*/
public final void updateBotCount(Integer count) {
botCountField.setText(count.toString());
}
/**
* Updates the entities count on the EntityPanel.
*
* @param count The total epartner count.
*/
public final void updateEPartnerCount(Integer count) {
epartnerCountField.setText(count.toString());
}
public JButton getNewEPartnerButton() {
return newEpartner;
}
public JButton getDeleteEPartnerButton() {
return deleteEpartner;
}
public JButton getModifyEPartnerButton() {
return modifyEpartner;
}
public JButton getNewBotButton() {
return newBot;
}
public JButton getModifyBotButton() {
return modifyBot;
}
public JButton getDeleteBotButton() {
return deleteBot;
}
public int getSelectedBotRow() {
return botTable.getSelectedRow();
}
public final int getSelectedEPartnerRow() {
return ePartnerTable.getSelectedRow();
}
/**
* Returns if changes has been made to the last configuration.
*
* @return whether changes have been made.
*/
public final boolean isDefault() {
boolean isDefault = true;
if (this.botList.getRowCount() != 0) {
isDefault = false;
} else if (this.epartnerList.getRowCount() != 0) {
isDefault = false;
}
return isDefault;
}
public static String getBotTableName() {
return botTableName;
}
public static String getePartnerTableName() {
return ePartnerTableName;
}
public boolean isBotStore() {
return bs;
}
public void setBotStore(boolean bs) {
this.bs = bs;
}
public boolean isEpartnerStore() {
return es;
}
public void setEpartnerStore(boolean es) {
this.es = es;
}
public void addNewBotController(ActionListener controller) {
getNewBotButton().addActionListener(controller);
}
public void addModifyBotController(ActionListener controller) {
getModifyBotButton().addActionListener(controller);
}
public void addDeleteBotController(ActionListener controller) {
getDeleteBotButton().addActionListener(controller);
}
public void addNewEpartnerController(ActionListener controller) {
getNewEPartnerButton().addActionListener(controller);
}
public void addModifyEpartnerController(ActionListener controller) {
getModifyEPartnerButton().addActionListener(controller);
}
public void addDeleteEpartnerController(ActionListener controller) {
getDeleteEPartnerButton().addActionListener(controller);
}
public void addDropDownController(ActionListener controller) {
getDropDownButton().addActionListener(controller);
}
public void addNewStandardBotController(ActionListener controller) {
getAddNewStandardBotMenuItem().addActionListener(controller);
}
public void addNewStandardBotBigController(ActionListener controller) {
getAddNewStandardBotBigMenuItem().addActionListener(controller);
}
public void addNewStandardBotGripperController(ActionListener controller) {
getAddNewStandardBotGripperMenuItem().addActionListener(controller);
}
public void addNewStandardBotBigGripperController(ActionListener controller) {
getAddNewStandardBotBigGripperMenuItem().addActionListener(controller);
}
public void addNewStandardBotSeeerController(ActionListener controller) {
getAddNewStandardBotSeeerMenuItem().addActionListener(controller);
}
public void addNewStandardBotBigSeeerController(ActionListener controller) {
getAddNewStandardBotBigSeeerMenuItem().addActionListener(controller);
}
public void addNewStandardBotCommunicatorController(ActionListener controller) {
getAddNewStandardBotCommunicatorMenuItem().addActionListener(controller);
}
public void addNewStandardBotBigCommunicatorController(ActionListener controller) {
getAddNewStandardBotBigCommunicatorMenuItem().addActionListener(controller);
}
public void addBotTableModelController(TableModelListener controller) {
getBotTableModel().addTableModelListener(controller);
}
public void addEpartnerTableModelController(TableModelListener controller) {
getEPartnerTableModel().addTableModelListener(controller);
}
public void addBotTableController(TableModelListener controller) {
getBotTable().getModel().addTableModelListener(controller);
}
public void addEpartnerTableController(TableModelListener controller) {
getEPartnerTable().getModel().addTableModelListener(controller);
}
}